#include <iostream>
using namespace std;

// 把可能出现的全角字符转成半角 ASCII：'（'->'(', '）'->')', '？'->'?'
char normChar(char c){
    static unordered_map<char,char> m = {
        {'（','('}, {'）',')'}, {'？','?'}
    };
    auto it = m.find(c);
    return it==m.end() ? c : it->second;
}

// 判断一个只含 '(' 和 ')' 的串是否是合法括号序列
bool isValid(const string& s){
    int bal = 0;
    for(char c: s){
        if(c=='(') ++bal;
        else if(c==')'){
            --bal;
            if(bal<0) return false; // 任一前缀右括号更多 => 非法
        }else{
            return false; // 这里不应出现其它字符
        }
    }
    return bal==0;
}

// 判断：是否存在恰好删除 s 的某一位后得到合法括号串
bool canDeleteOneToValid(const string& s){
    if(s.size()==0) return false; // 不能删负数位
    for(size_t i=0;i<s.size();++i){
        string t = s.substr(0,i) + s.substr(i+1);
        if(isValid(t)) return true;
    }
    return false;
}

// 对含 '?' 的串：是否存在一种将 '?' 替换为 '(' 或 ')' ，
// 使得「删掉恰好一个字符」后变成合法括号串
bool possibleNearValidWithChoices(const string& s){
    vector<int> qpos;
    for(int i=0;i<(int)s.size();++i) if(s[i]=='?') qpos.push_back(i);
    int k = (int)qpos.size();
    // 2^k 次尝试（|s|<=20，枚举可承受）
    for(int mask=0; mask < (1<<k); ++mask){
        string t = s;
        for(int j=0;j<k;++j){
            t[qpos[j]] = ( (mask>>j)&1 ) ? ')' : '(';
        }
        if(canDeleteOneToValid(t)) return true;
    }
    return false;
}

int func1(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    if(!(cin>>T)) return 0;
    string S;
    while(T--){
        cin >> ws;
        getline(cin, S);                 // 读整行，保险
        // 规范化字符
        for(char& c: S) c = normChar(c);

        int n = (int)S.size();
        long long ans = 0;
        // 枚举所有子串 [l, r]
        for(int l=0;l<n;++l){
            for(int r=l;r<n;++r){
                string sub = S.substr(l, r-l+1);
                if(possibleNearValidWithChoices(sub)) ++ans;
            }
        }
        cout << ans << "\n";
    }
    return 0;
}


const int MOD = 1'000'000'007;
struct BIT {
    int n; vector<long long> t;
    BIT(int n=0): n(n), t(n+1,0) {}
    void add(int i, long long v){ for(; i<=n; i+=i&-i){ t[i]+=v; if(t[i]>=MOD) t[i]-=MOD; } }
    long long sumPrefix(int i){ long long s=0; for(; i>0; i-=i&-i){ s+=t[i]; if(s>=MOD) s-=MOD; } return s; }
};

int func2(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    if(!(cin>>T)) return 0;
    while(T--){
        int n; cin>>n;
        vector<int> a(n+1);
        int mx = 0;
        for(int i=1;i<=n;i++){ cin>>a[i]; mx = max(mx, a[i]); }

        // 统计每个值的最左 L、最右 R（值域 ≤ 2e5）
        vector<int> L(mx+1, INT_MAX), R(mx+1, INT_MIN);
        vector<int> used;
        used.reserve(n);
        for(int i=1;i<=n;i++){
            int v=a[i];
            if(L[v]==INT_MAX) used.push_back(v);
            L[v]=min(L[v], i);
            R[v]=max(R[v], i);
        }

        // 按“值从小到大”取出区间
        sort(used.begin(), used.end());
        vector<pair<int,int>> seg; seg.reserve(used.size());
        for(int v: used) seg.push_back({L[v], R[v]}); // 与 used 同序（值递增）

        // 坐标压缩 R，用于 BIT 前缀和
        vector<int> allR; allR.reserve(seg.size());
        for(auto &p: seg) allR.push_back(p.second);
        sort(allR.begin(), allR.end());
        allR.erase(unique(allR.begin(), allR.end()), allR.end());
        auto idxR = [&](int r){
            return int(upper_bound(allR.begin(), allR.end(), r) - allR.begin()); // 1..m
        };

        BIT bit((int)allR.size());
        long long ans = 1; // 全删方案
        for(auto &p: seg){
            int Lv = p.first, Rv = p.second;
            // 查询所有 R < Lv 的 dp 之和
            int pos = int(lower_bound(allR.begin(), allR.end(), Lv) - allR.begin()); // R <= Lv-1
            long long sumPrev = bit.sumPrefix(pos);
            long long dp = (1 + sumPrev) % MOD; // 只保留自己 + 承接前面的链
            ans += dp; if(ans>=MOD) ans-=MOD;
            bit.add(idxR(Rv), dp);
        }
        cout << ans % MOD << "\n";
    }
    return 0;
}